package model;
import javax.swing.JOptionPane;
import java.text.DecimalFormat;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import view.Gui;
public class TaskGenerator implements Runnable {
private static int currentTime = 0;
private int minimumArrival, maximumArrival, minimumServiceTime, maximumServiceTime;
private int simulationTime;
private int numberOfQueues, nrOfTasksPerQueue;
private double waitingAverage, serviceAverage, emptyQueueTimeAverage;
private TaskScheduler taskScheduler;
private Gui gui;
private Server[] servers;
private BlockingQueue<Task> tasks;
private DecimalFormat decimalFormat;
private volatile boolean running;
public TaskGenerator(Gui gui, int minimumArrival, int maximumArrival, int minimumServiceTime,
int maximumServiceTime, int simulationTime, int numberOfQueues, int nrOfTasksPerQueue, int queueClose,
int time) {
this.gui = gui;
this.minimumArrival = minimumArrival;
this.maximumArrival = maximumArrival;
this.minimumServiceTime = minimumServiceTime;
this.maximumServiceTime = maximumServiceTime;
this.simulationTime = simulationTime;
this.setNumberOfQueues(numberOfQueues);
this.setNrOfTasksPerQueue(nrOfTasksPerQueue);
decimalFormat = new DecimalFormat();
taskScheduler = new TaskScheduler(numberOfQueues, nrOfTasksPerQueue, queueClose, time);
}
private int getRandomWithinRange(int min, int max) {
int range = (max - min + 1);
return ((int) (Math.random() * range) + min);
}
private void displayResults() {
servers = taskScheduler.getAllServers();
for (Server serv : servers) {
waitingAverage += serv.getAverageWaitingTime();
serviceAverage += serv.getAverageServiceTime();
emptyQueueTimeAverage += serv.getEmptyQueueTime();
}
waitingAverage /= servers.length;
serviceAverage /= servers.length;
emptyQueueTimeAverage /= servers.length;
JOptionPane.showMessageDialog(gui,
"Results: waiting time average: " + decimalFormat.format(waitingAverage) + ", service time average: "
+ decimalFormat.format(serviceAverage) + ", empty queue time average: "
+ decimalFormat.format(emptyQueueTimeAverage) + ", peak hour: " + taskScheduler.getPeakHour(),
"End of simulation", JOptionPane.INFORMATION_MESSAGE);
}
private void setAllTasks() {
int nrOfTasks = simulationTime;
tasks = new ArrayBlockingQueue<Task>(nrOfTasks);
while (nrOfTasks > 0) {
int arrivalTime = getRandomWithinRange(minimumArrival, maximumArrival);
int serviceTime = getRandomWithinRange(minimumServiceTime, maximumServiceTime);
tasks.add(new Task(arrivalTime, serviceTime));
nrOfTasks--;
}
}
private void scheduleTasksPerTime() {
for (Task task : tasks) {
if (task.getArrivalTime() == currentTime) {
taskScheduler.addTask(task);
tasks.remove(task);
}
}
}
@Override
public void run() {
running = true;
setAllTasks();
while (running) {
scheduleTasksPerTime();
gui.displayAction(taskScheduler.getAllServers());
currentTime++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (currentTime == simulationTime) {
running = false;
System.out.println("END");
displayResults();
}
}
}
public int getNrOfTasksPerQueue() {
return nrOfTasksPerQueue;
}
public static int getCurrentTime() {
return currentTime;
}
public void setNrOfTasksPerQueue(int nrOfTasksPerQueue) {
this.nrOfTasksPerQueue = nrOfTasksPerQueue;
}
public int getNumberOfQueues() {
return numberOfQueues;
}
public void setNumberOfQueues(int numberOfQueues) {
this.numberOfQueues = numberOfQueues;
}
}